import cv2
import numpy as np
import matplotlib
matplotlib.use('TkAgg')  # 或 'Qt5Agg' 或其他支持的后端
import matplotlib.pyplot as plt

# 读取彩色图像
image = cv2.imread('../roi_img.jpg')

# 检查图像是否正确加载
if image is None:
    print("Error: Unable to load image.")
else:
    # 将图像从 BGR 转换为 HSV（因为HSV颜色空间对于直方图反投影比较有用）
    image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

    # 选择一个感兴趣的区域（ROI），这里我们选择一个矩形区域
    x, y, w, h = 0, 25, 220, 300  # 定义ROI的坐标和大小
    roi = image_hsv[y:y+h, x:x+w]  # 提取ROI区域

    # 计算ROI区域的直方图
    roi_hist = cv2.calcHist([roi], [0], None, [256], [0, 256])

    # 将直方图归一化
    cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)

    # 计算目标图像的反投影
    backproject = cv2.calcBackProject([image_hsv], [0], roi_hist, [0, 256], 1)

    # 对反投影结果应用阈值，以便更好地显示感兴趣区域
    _, thresholded = cv2.threshold(backproject, 50, 255, cv2.THRESH_BINARY)

    # 绘制结果
    plt.figure(figsize=(12, 6))

    # 原始图像
    plt.subplot(1, 3, 1)
    plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    plt.title('Original Image')
    plt.axis('off')

    # 选择的ROI
    plt.subplot(1, 3, 2)
    plt.imshow(cv2.cvtColor(roi, cv2.COLOR_BGR2RGB))
    plt.title('Selected ROI')
    plt.axis('off')

    # 反投影结果
    plt.subplot(1, 3, 3)
    plt.imshow(thresholded, cmap='gray')
    plt.title('Backprojection Result')
    plt.axis('off')

    plt.tight_layout()
    plt.show()

    # 显示原始图像和反投影结果
    cv2.imshow("Original Image", image)
    cv2.imshow("Backprojection Result", thresholded)

    cv2.waitKey(0)
    cv2.destroyAllWindows()
